package controllers

import (
	"encoding/json"
	"fmt"
	"strconv"
	"supershare/backend/models"
	"time"

	"github.com/beego/beego/v2/core/logs"
)

// MeituanGroupController 美团团购管理控制器
type MeituanGroupController struct {
	BaseController
}

// List 获取美团团购活动列表
func (c *MeituanGroupController) List() {
	page, pageSize := c.GetPaginationParams()
	storeId, _ := c.GetInt64("store_id", 0)
	meituanId, _ := c.GetInt64("meituan_id", 0)
	status, _ := c.GetInt("status", -1)
	title := c.GetString("title")

	// 构建过滤条件
	filters := make(map[string]interface{})
	if storeId > 0 {
		filters["store_id"] = storeId
	}
	if meituanId > 0 {
		filters["meituan_id"] = meituanId
	}
	if status != -1 {
		filters["status"] = status
	}
	if title != "" {
		filters["title"] = title
	}

	// 获取团购活动列表
	list, total, err := models.GetMeituanGroupList(page, pageSize, filters)
	if err != nil {
		logs.Error("获取美团团购活动列表失败: %v", err)
		c.Fail("获取美团团购活动列表失败")
		return
	}

	c.SuccessWithPagination("获取美团团购活动列表成功", list, total, page, pageSize)
}

// Create 创建美团团购活动
func (c *MeituanGroupController) Create() {
	admin, ok := c.GetAdmin()
	if !ok {
		return
	}

	var req models.MeituanGroup
	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &req); err != nil {
		logs.Error("解析创建美团团购活动请求参数失败: %v", err)
		c.Fail("无效的请求参数")
		return
	}

	// 参数验证
	if err := c.validateMeituanGroupRequest(&req); err != nil {
		c.Fail(err.Error())
		return
	}

	// 检查门店是否存在
	store, err := models.GetStoreById(req.StoreId)
	if err != nil || store == nil {
		logs.Error("创建美团团购活动时门店不存在: %v", err)
		c.Fail("门店不存在")
		return
	}

	// 检查美团配置是否存在
	meituanConfig, err := models.GetMeituanByStoreId(req.StoreId)
	if err != nil || meituanConfig == nil {
		logs.Error("创建美团团购活动时美团配置不存在: %v", err)
		c.Fail("该门店尚未配置美团接口，请先配置")
		return
	}

	// 设置创建参数
	req.MeituanId = meituanConfig.Id
	req.StoreName = store.Name
	req.Status = 1
	req.IsDeleted = 0
	req.LastSyncTime = time.Now().Unix()

	// 保存到数据库
	id, err := models.AddMeituanGroup(&req)
	if err != nil {
		logs.Error("保存美团团购活动失败: %v", err)
		c.Fail("保存美团团购活动失败")
		return
	}

	c.LogOperation(admin, "meituan:group:create",
		"创建美团团购活动, ID: "+strconv.FormatInt(id, 10)+", 标题: "+req.Title)

	c.Success("创建美团团购活动成功", map[string]interface{}{"id": id})
}

// GetOne 获取单个美团团购活动详情
func (c *MeituanGroupController) GetOne() {
	id, ok := c.ValidateIDParam()
	if !ok {
		return
	}

	group, err := models.GetMeituanGroupById(id)
	if err != nil {
		logs.Error("获取美团团购活动详情失败: %v", err)
		c.Fail("获取美团团购活动详情失败")
		return
	}
	if group == nil {
		c.Fail("美团团购活动不存在")
		return
	}

	c.Success("获取美团团购活动详情成功", group)
}

// Update 更新美团团购活动
func (c *MeituanGroupController) Update() {
	admin, ok := c.GetAdmin()
	if !ok {
		return
	}

	id, ok := c.ValidateIDParam()
	if !ok {
		return
	}

	var req models.MeituanGroup
	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &req); err != nil {
		logs.Error("解析更新美团团购活动请求参数失败: %v", err)
		c.Fail("无效的请求参数")
		return
	}

	// 参数验证
	if err := c.validateMeituanGroupRequest(&req); err != nil {
		c.Fail(err.Error())
		return
	}

	// 获取现有活动
	group, err := models.GetMeituanGroupById(id)
	if err != nil {
		logs.Error("获取美团团购活动失败: %v", err)
		c.Fail("获取美团团购活动失败")
		return
	}
	if group == nil {
		c.Fail("美团团购活动不存在")
		return
	}

	// 更新字段
	group.Title = req.Title
	group.Description = req.Description
	group.OriginalPrice = req.OriginalPrice
	group.GroupPrice = req.GroupPrice
	group.MinCount = req.MinCount
	group.MaxCount = req.MaxCount
	group.StartTime = req.StartTime
	group.EndTime = req.EndTime
	group.Status = req.Status
	group.ActivityRules = req.ActivityRules
	group.ServiceTerms = req.ServiceTerms
	group.Images = req.Images
	group.MeituanGroupId = req.MeituanGroupId

	if err := models.UpdateMeituanGroup(group); err != nil {
		logs.Error("更新美团团购活动失败: %v", err)
		c.Fail("更新美团团购活动失败")
		return
	}

	c.LogOperation(admin, "meituan:group:update",
		"更新美团团购活动, ID: "+strconv.FormatInt(id, 10)+", 标题: "+group.Title)

	c.Success("更新美团团购活动成功", nil)
}

// Delete 删除美团团购活动
func (c *MeituanGroupController) Delete() {
	admin, ok := c.GetAdmin()
	if !ok {
		return
	}

	id, ok := c.ValidateIDParam()
	if !ok {
		return
	}

	// 查询原有数据
	group, err := models.GetMeituanGroupById(id)
	if err != nil {
		logs.Error("获取美团团购活动失败: %v", err)
		c.Fail("获取美团团购活动失败")
		return
	}
	if group == nil {
		c.Fail("美团团购活动不存在")
		return
	}

	// 执行删除操作
	if err := models.DeleteMeituanGroup(id); err != nil {
		logs.Error("删除美团团购活动失败: %v", err)
		c.Fail("删除美团团购活动失败")
		return
	}

	c.LogOperation(admin, "meituan:group:delete",
		"删除美团团购活动, ID: "+strconv.FormatInt(id, 10)+", 标题: "+group.Title)

	c.Success("删除美团团购活动成功", nil)
}

// validateMeituanGroupRequest 验证美团团购活动请求参数
func (c *MeituanGroupController) validateMeituanGroupRequest(req *models.MeituanGroup) error {
	if req.StoreId <= 0 {
		return fmt.Errorf("门店ID不能为空")
	}
	if req.Title == "" {
		return fmt.Errorf("活动标题不能为空")
	}
	if req.GroupPrice <= 0 {
		return fmt.Errorf("团购价格必须大于0")
	}
	return nil
}
